Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
使用linq间接寻址:更改查询表达式“;选择";根据用户参数_Linq_C# 4.0_Reflection_Linq To Entities_Indirection - Fatal编程技术网

使用linq间接寻址:更改查询表达式“;选择";根据用户参数

使用linq间接寻址:更改查询表达式“;选择";根据用户参数,linq,c#-4.0,reflection,linq-to-entities,indirection,Linq,C# 4.0,Reflection,Linq To Entities,Indirection,我使用一个表“TLanguage”来记录我的站点的标签结果。我在这个表中有4列:法语、英语、德语和西班牙语 在MVC应用程序中,我使用以下查询: var req = (from TYP in context.TYP_TypeMission join ML in context.TLanguage on TYP.IDTMultiLanguage equals ML.IDTMultiLanguage where TYP.ID

我使用一个表“TLanguage”来记录我的站点的标签结果。我在这个表中有4列:法语、英语、德语和西班牙语

在MVC应用程序中,我使用以下查询:

 var req = (from TYP in context.TYP_TypeMission
                   join ML in context.TLanguage on TYP.IDTMultiLanguage equals ML.IDTMultiLanguage
                  where TYP.IDTFiliale == idFiliale
                  orderby TYP.LibTypeMission
                  select new SelectListItem
                  {
                      Selected = TYP.IdTypeMission == idTypeMission,
                      Value = SqlFunctions.StringConvert((double)TYP.IdTypeMission),
                      Text = ML.French
                  }).ToList();
根据我的网站语言,我如何在我的查询中通过ML.英语或ML.德语更改ML.法语


是否可以在查询中创建间接寻址?

您可以将查询的开头保存到变量中,以后只更改最后一部分:

var query = from TYP in context.TYP_TypeMission
            join ML in context.TLanguage on TYP.IDTMultiLanguage equals ML.IDTMultiLanguage
            where TYP.IDTFiliale == idFiliale
            orderby TYP.LibTypeMission
            select new { ML, TYP };

List<SelectListItem> req;

if(Site.Lang == "DE")
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.German 
           }).ToList();
}
else if(Site.Lang == "FR")
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.French
           }).ToList();
}
else
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.English
           }).ToList();
}
var query=来自context.TYP\u TypeMission中的TYP
在type.IDTMultiLanguage上的context.t语言中连接ML等于ML.IDTMultiLanguage
其中,TYP.idtFilile==idFilile
orderby type.LibTypeMission
选择新的{ML,TYP};
列表请求;
如果(Site.Lang==“DE”)
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.derman
}).ToList();
}
else if(Site.Lang==“FR”)
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.French
}).ToList();
}
其他的
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.English
}).ToList();
}

在调用
ToList()
之前,不会执行查询。

您可以将查询的开头保存到变量中,以后只更改最后一部分:

var query = from TYP in context.TYP_TypeMission
            join ML in context.TLanguage on TYP.IDTMultiLanguage equals ML.IDTMultiLanguage
            where TYP.IDTFiliale == idFiliale
            orderby TYP.LibTypeMission
            select new { ML, TYP };

List<SelectListItem> req;

if(Site.Lang == "DE")
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.German 
           }).ToList();
}
else if(Site.Lang == "FR")
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.French
           }).ToList();
}
else
{
    req = (from item in query
           select new SelectListItem
           {
               Selected = item.TYP.IdTypeMission == idTypeMission,
               Value = SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
               Text = item.ML.English
           }).ToList();
}
var query=来自context.TYP\u TypeMission中的TYP
在type.IDTMultiLanguage上的context.t语言中连接ML等于ML.IDTMultiLanguage
其中,TYP.idtFilile==idFilile
orderby type.LibTypeMission
选择新的{ML,TYP};
列表请求;
如果(Site.Lang==“DE”)
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.derman
}).ToList();
}
else if(Site.Lang==“FR”)
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.French
}).ToList();
}
其他的
{
req=(来自查询中的项)
选择新的SelectListItem
{
所选=item.TYP.IdTypeMission==IdTypeMission,
Value=SqlFunctions.StringConvert((double)item.TYP.IdTypeMission),
Text=item.ML.English
}).ToList();
}

在调用
ToList()
之前,不会执行查询。

可以按如下方式对映射进行参数化:

public class TLanguageMap : EntityTypeConfiguration<TLanguage>
{
    public TLanguageMap(string language)
    {
        this.HasKey(t => t.TLanguageId);
        this.Property(t => t.Translation).HasColumnName(language);
    }
}
以及其构造器:

public LocalizableContext(string language)
{
    this._language = language;
}
现在,在构建上下文时,您可以确定它是哪种语言:

var context = new LocalizableContext("French");
查询将始终为:

...
select new SelectListItem
{
    Selected = TYP.IdTypeMission == idTypeMission,
    Value = SqlFunctions.StringConvert((double)TYP.IdTypeMission),
    Text = ML.Translation
})

您可能希望通过对语言使用
enum
switch
语句来获取数据库列名,从而使其更加健壮。

可以像这样对映射进行参数化:

public class TLanguageMap : EntityTypeConfiguration<TLanguage>
{
    public TLanguageMap(string language)
    {
        this.HasKey(t => t.TLanguageId);
        this.Property(t => t.Translation).HasColumnName(language);
    }
}
以及其构造器:

public LocalizableContext(string language)
{
    this._language = language;
}
现在,在构建上下文时,您可以确定它是哪种语言:

var context = new LocalizableContext("French");
查询将始终为:

...
select new SelectListItem
{
    Selected = TYP.IdTypeMission == idTypeMission,
    Value = SqlFunctions.StringConvert((double)TYP.IdTypeMission),
    Text = ML.Translation
})

您可能希望通过对语言使用
enum
switch
语句来获取数据库列名,从而使其更加健壮。

谢谢,但我希望在查询中创建一个间接寻址。谢谢,但我希望在查询中创建一个间接寻址。这是一个有趣的解决方案。不幸的是,我使用'ObjectContext'而不是'DBContext'来创建我的上下文,我不能使用'OnModelCreating'。这是一个有趣的解决方案。不幸的是,我使用'ObjectContext'而不是'DBContext'来创建我的上下文,我不能使用'OnModelCreating'。