Entity Framework и анонимные объекты в C # - PullRequest
0 голосов
/ 19 июня 2019

Я бы хотел отфильтровать List<object> с помощью Entity Framework.List<object> является результатом более старого кода (цикл ниже).

public class Item
{
    int Id;
    string name;
}


var result = new List<object>();

foreach (@item in items)
{
   // Do some computation that results in a value for Id and name
   int Id = 1;
   string name = "test";

   // return anonymous type
   return new { itemId = Id; itemName = name};
}

Теперь я хотел бы сделать что-то вроде этого:

var newResult = result.OrderBy(x => x.itemId).Where(x => x.itemName.ToUpper().Contains(("test").ToUpper()));

Но так как resultСписок object s, я получаю сообщение об ошибке, если пытаюсь получить доступ к атрибуту, который он не видит:

Error   CS1061  'object' does not contain a definition for 'itemId' and no accessible extension method 'itemId' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

.Как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я не совсем понял ваше намерение не использовать List<Item>, но есть хитрый способ сделать это, и он работает, если типы находятся в одной сборке:

public T Cast<T>(object obj, T type) => 
    (T)obj;

ииспользование:

// You can create an extension method if you want
var newResult = result.Select(s => Cast(s, new { itemId = default(int), itemName = default(string) }))
                      .Where(x => x.itemName.Contains(("test").ToUpper()));

DotNetFiddle Link

0 голосов
/ 19 июня 2019

Вот как я бы изменил ваш исходный код, чтобы запрос работал

public class Item
{
    int Id;
    string name;
}


var result = new List<Item>();

foreach (@item in items)
{
   // Do some computation that results in a value for Id and name
   int Id = 1;
   string name = "test";

   // return anonymous type
   return new Item(){ Id = Id; name = name};
}

Если использование Item не вариант, вы можете объявить результат как List<dynamic>

...