cevap

0

Hata değil. Belki bir sınırlama veya ihmal. Görünüşe göre bu kullanım durumu hiç dikkate alınmadı. EF , otomatik olarak oluşturulmuş parametre adlarını kullanabilir, ancak, evet, sadece yapmaz.

.AsEnumerable() ile işlevlerden birini çağırmak için başvurmanız gerekir. Herhangi bir sebepten dolayı, bu, katılmadaki ilk işlev olmalıdır (yaşadığım gibi). İkinci işlevi .AsEnumerable() ile çağırırsanız, yine de SQL'e çevrilir ve ad çakışması hala gerçekleşir.

9

Microsoft'un parametre adlarını en azından bağlam başına göre benzersiz yapması çok güzel olurdu.

Bu here için bir sorun yaratıyorum.

private void WriteFunctionImport(TypeMapper typeMapper, CodeStringGenerator codeStringGenerator, EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) { 
    if (typeMapper.IsComposable(edmFunction)) 
    { 
#> 

    [EdmFunction("<#=edmFunction.NamespaceName#>", "<#=edmFunction.Name#>")] 
    <#=codeStringGenerator.ComposableFunctionMethod(edmFunction, modelNamespace)#> 
    {  var guid = Guid.NewGuid().ToString("N"); <#+ 
     codeStringGenerator.WriteFunctionParameters(edmFunction, " + guid", WriteFunctionParameter); 
#> 
     <#=codeStringGenerator.ComposableCreateQuery(edmFunction, modelNamespace)#> 
    } <#+ 
    } 
    else 
    { 
#> 

    <#=codeStringGenerator.FunctionMethod(edmFunction, modelNamespace, includeMergeOption)#> 
    { <#+ 
     codeStringGenerator.WriteFunctionParameters(edmFunction, "", WriteFunctionParameter); 
#> 
     <#=codeStringGenerator.ExecuteFunction(edmFunction, modelNamespace, includeMergeOption)#> 
    } <#+ 
     if (typeMapper.GenerateMergeOptionFunction(edmFunction, includeMergeOption)) 
     { 
      WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: true); 
     } 
    } } 

: Bu arada

, bunu zamanında her parametre adına bir GUID ekler, böylece .Context.tt dosyasında birkaç fonksiyonları değişiklikler yaparak işe bu olsun edebildi. ..

public void WriteFunctionParameters(EdmFunction edmFunction, string nameSuffix, Action<string, string, string, string> writeParameter) 
{ 
    var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); 
    foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) 
    { 
     var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; 
     var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\"" + nameSuffix + ", " + parameter.FunctionParameterName + ")"; 
     var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\"" + nameSuffix + ", typeof(" + parameter.RawClrTypeName + "))"; 
     writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit); 
    } 
} 

...

public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace) 
{ 
    var parameters = _typeMapper.GetParameters(edmFunction); 

    return string.Format(
     CultureInfo.InvariantCulture, 
     "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<{0}>(\"[{1}].[{2}]({3})\"{4});", 
     _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), 
     edmFunction.NamespaceName, 
     edmFunction.Name, 
     string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName + "\" + guid + \"").ToArray()), 
     _code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))); 
}