Linq-to-Entities扩展字符串连接

时间:2016-06-09 04:40:21

标签: c# linq

考虑一下:

var query = (from u in entity.Users
             select new
                    {
                        FullName = u.FirstName + " " + u.LastName
                    }
            );

哪种方法很好,但我想做的是:

var query = (from u in entity.Users
                select new
                {
                    FullName = u.FullName
                }
            );

我正在使用返回(u.FirstName + " " + u.LastName)

的元数据
[NotMapped]
public string FullName
{
    get
    {
        return FirstName + " " + LastName;
    }
}

但是我收到了一个错误:

  

LINQ to Entities不支持指定的类型成员'FullName'。

我知道如果我实现查询它会工作正常,但我不想这样做。我想在数据库级别进行,所以最好的方法是什么呢,这有可能吗?或者我必须始终(u.FirstName + " " + u.LastName)

p.s:我也试过这个:(不适合我)

public static Expression<Func<User, string>> FullName()
{
    return u => u.FirstName + " " + u.LastName;
}

谢谢

1 个答案:

答案 0 :(得分:1)

由于db不知道如何执行服务器端方法,因此无法工作。 可能的选择:

Translation library:

private static readonly CompiledExpression<Customer, string> fullNameExpression
   = DefaultTranslationOf<User>.Property(e => e.FullName)
                .Is(e => e.FirstName + " " + e.LastName);

[NotMapped]
public string FullName
{
     get { return fullNameExpression.Evaluate(this); }
}

var q = dbContext.Users.Select(u => new
     {
         FullName = u.FullName
     }).WithTranslations(); 

DelegateDecompiler library:

[NotMapped]
[Computed]
public string FullName
{
     get { return FirstName + " " + LastName; }
}


var q = dbContext.Users.Select(u => new
     {
         FullName = u.FullName
     }).Decompile(); 

封装:

public static Expression<Func<MyEntity, MyDto>> SelectFullNames()
{
      return e => new MyDto{} { Fullname = e.FirstName + " " + e.LastName; 
}

var queryable = dbConext.Users.Select(SelectFullNames());

免责声明 - 我没有在真实世界中使用图书馆。