Linq to Entities和可重用逻辑

时间:2013-10-29 20:09:18

标签: linq-to-entities

如果我有一个由数据库中的表表示的类

public class Foo
{
    public string Bar1 {get; set;}
    public string Bar2 {get; set;}
}

class DataContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
}

public enum FooDataStatus {Bar1Missing, Bar2Missing, Bar1And2Missing, Complete}

public class MappedFoo
 {
    public string Bar1 {get; set;}
    public string Bar2 {get; set;}
    public FooDataStatus DataStatus ... property or method ...
}

我希望能够重用逻辑来为MappedFoo的单个实例返回FooDataStatus,并且还为iqueryables返回,这样我可以获得数据库中具有每个FooDataStatus的记录数量而不传递所有记录数据库。

int completedRecords = (From f in DataContext.Foos
                        ....magic goes here ...
                        ).Count(d=>d==FooDataStatus.Complete);

请注意这是我所追求的简化版本,但所有逻辑都很容易映射sql等效运算符,但复杂到重复逻辑似乎并不明智。

(From f in DataContext.Foos
 where f.Bar1!=null && f.Bar1!="" && f.Bar2!=null && f.Bar2 != "").Count();

如何创建更可重用的逻辑集?

1 个答案:

答案 0 :(得分:0)

我最终使用(我希望有关如何改进的任何提示,特别是 DataStatus get属性访问者)&gt;我很高兴在下面标注答案改进:

public class Foo : IFoo
{
    public string Bar1 {get; set;}
    public string Bar2 {get; set;}
}

public class MappedFoo : IFoo
{
    public string Bar1 {get; set;}
    public string Bar2 {get; set;}
    public FooDataStatus DataStatus { get { return CalculateRecordStatusOption.Compile()(this);}}
    public static Expression<Func<IFoo, FooDataStatus>> CalculateRecordStatusOption =
        r =>
            (r.Bar1 == null || r.Bar1 == "")
                ? FooDataStatus.Bar1Missing
                :(r.Bar2 == null || r.Bar2 == "")
                    ? FooDataStatus.Bar2Missing
                    : FooDataStatus.NoneMissing;
}

interface IFoo
{
    string Bar1 {get; set;}
    string Bar2 {get; set;}
}

class Program
{
    static void Main()
    {
        using (var context = new DataContext())
        {
            var emptyRecordCount = context.Foos
                .Select(MappedFoo.CalculateRecordStatusOption)
                .Count(f=>f == FooDataStatus.NoneMissing);