Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在linq中使用自定义方法创建实体_C#_Entity Framework_Ef Code First_Linq To Entities - Fatal编程技术网

C# 在linq中使用自定义方法创建实体

C# 在linq中使用自定义方法创建实体,c#,entity-framework,ef-code-first,linq-to-entities,C#,Entity Framework,Ef Code First,Linq To Entities,我的数据库中有一个Person表,其中有NationalId字段。 有没有办法在不将所有人员加载到内存的情况下,先使用Ef code和Linq to entities将所有人员加载到偶数国家 例如: public bool IsEven(int number) { return number % 2 == 0; } var context = new MyContext(); var personsWithEvenNationalId = context.Persons

我的数据库中有一个
Person
表,其中有
NationalId
字段。 有没有办法在不将所有
人员
加载到内存的情况下,先使用
Ef code
Linq to entities
将所有人员加载到偶数
国家

例如:

public  bool IsEven(int number)
{
   return number % 2 == 0;
}

var context = new MyContext();
var personsWithEvenNationalId = context.Persons
                                       .Where(x=> IsEven(x.NationalId))
                                       .ToList();

您必须在线进行检查

var personsWithEvenNationalId = context.Persons
                                       .Where(x=> x.NationalId%2 == 0)
                                       .ToList();
LINQtoEntities基本上不知道如何将自定义方法转换为SQL。如果您确实需要使用自定义方法,则必须将人员作为可枚举对象,然后使用自定义方法,即

var personsWithEvenNationalId = context.Persons
                                       .AsEnumerable()
                                       .Where(x=> IsEven(x.NationalId))
                                       .ToList();
但这并不理想,因为它会加载所有人,然后过滤到IsEven

Edit:考虑一下,如果不想每次都内联编写,还可以为
IQueryable
创建一个扩展方法。类似这样的东西,在这里您构建一个
表达式

    public static IQueryable<Person> WhereEven(this IQueryable<Person> source, Expression<Func<Person, int>> property)
    {
        var expression = Expression.Equal(
            Expression.Modulo(
                property.Body,
                Expression.Constant(2)),
            Expression.Constant(0));

        var methodCallExpression = Expression.Call(typeof (Queryable),
            "where",
            new Type[] {source.ElementType},
            source.Expression,
            Expression.Lambda<Func<Person, bool>>(expression, property.Parameters));

        return source.Provider.CreateQuery<Person>(methodCallExpression);
    }

您需要一个函数(或属性或字段)来提供一个
表达式
,该表达式可以进行您想要的投影,而不是实现您想要的功能:

public static Expression<Func<int, bool>> IsEven()
{
    return number => number % 2 == 0;
}

它可以工作,但是如果我想选择
Person
的所有字段,而只选择
NationalId
,那该怎么办?这太棒了!但是我请求你指导我把这些方法或道具放在哪里,你叫它们什么??请
public static Expression<Func<int, bool>> IsEven()
{
    return number => number % 2 == 0;
}
using(var context = new MyContext())
{
    var personsWithEvenNationalId = context.Persons
        .Select(x=> x.NationalId)
        .Where(IsEven())
        .ToList();
}