【问题标题】:Looking for a way to cast with entity framework 4寻找一种使用实体框架 4 进行投射的方法
【发布时间】:2018-06-13 23:21:43
【问题描述】:

由于新的需求,我们必须在当前开发中添加相同的翻译,内置实体框架 4,它使用 SQL Server。因此,如果我们有一个警报,例如,我们需要通过检查翻译一些值来带来数据,例如它的标题或描述。

表:

警报

  • AlertId int
  • AlertTypeId int
  • AlertTextEnum int

翻译

  • FieldId int
  • 字段名字符串
  • 代码字符串
  • 描述字符串
  • LanguageId int

因此,如果我们想要获取 AlertType 的文本,我们必须连接两个表并与 Translation.FieldName == "AlertTypeEnum" 和 Translation.Code == Alert.AlertTypeEnum 建立关系。主要是这样。

这里我在 LinqPad 上检查了我的肮脏方法,但不适用于此版本的 Entity-Framework,因为我不能使用 ToString 方法。

var o = Translations.Where(m => m.LanguageId == 1 && new List<string> {
                        "AlertTypeId"
                    }.Contains(m.FieldName));

 var list = from item in Alerts
            itemTranslation in  o item.AlertTypeId.ToString() equals itemTranslation.Code
                                    into ps
                                    from itemTranslation in ps.DefaultIfEmpty()             
            select new 
            {
                             AlertId = item.AlertId , 
                             AlertTypeDescr = itemTranslation.Description
            }.ToList();
        

因为这不起作用,所以我尝试在第一次查询之前将代码解析为整数,但它也不起作用。

var o = Translations.Where(m => m.LanguageId == 1 && new List<string> {
                    "AlertTypeId"
                }.Contains(m.FieldName)).
                Select (x => new {
                   Code = (int)( x.Code),
                   FieldName = x.FieldName,
                   Description = x.Description
                }).ToList();

var list = from item in Alerts
                         join itemTranslation in  o
                              on   item.AlertTypeId equals itemTranslation.Code 
                         select new 
                         {
                                       AlertId = item.AlertId , 
                                 AlertTypeDescr = itemTranslation.Description
   };

我得到“无法将类型 'string' 转换为 'int'”。

一些建议?我无法更改实体框架和模型的版本。

【问题讨论】:

  • EF 正在将您的查询转换为 SQL,因此您只能使用在 SQL 中具有等效功能的操作。您可以使用 ef 提供的 SqlFunctions 来执行此类操作,在您的特定情况下 SqlFunctions.StringConvert 可能会有所帮助。另见stackoverflow.com/questions/5971521/…

标签: c# .net linq entity-framework-4


【解决方案1】:

Linq to Entities 正在将您的查询转换为 SQL 脚本,并且没有将字符串转换为 int 的等价物。如果我没记错的话,SqlFunctions 中没有将string 转换为int 的方法。所以,我认为你应该改变你的方法并在没有任何原始转换/转换操作的情况下检索数据。查询性能也会更好。

您可以在内存中执行转换操作,也可以在属性级别进行转换。

另外,我建议你使用已知类型而不是匿名类型来选择它们。

所以,创建一个类;

public class TranslationModel
{

    public int Code
    {
        get
        {
            //Parse string
            if (!int.TryParse(CodeStr, out var val))
            {
                val = -1;
            }
            return val;
        }
    }

    public string CodeStr { get; set; }

    public string FieldName { get; set; }

    public string Description { get; set; }
}

更改您的查询;

var filterList = new List<string>{ "AlertTypeId" };
var o = Translations.Where(m => m.LanguageId == 1 && filterList.Contains(m.FieldName))
    .Select(x => new TranslationModel
    {
        CodeStr = x.Code,
        FieldName = x.FieldName,
        Description = x.Description
    }).ToList();

最后,您可以使用TransactionModel 中的Code 属性来使用Codeint 形式。

【讨论】:

  • 首先感谢您的回复。不幸的是,此代码无法运行,因为我们无法检索列表,然后在除“包含”操作之外的其他查询中使用它:{System.NotSupportedException:本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但包含运算符除外。在 System.Data.Linq.SqlClient.QueryConverter.CoerceToSequence(SqlNode 节点)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多