2015-01-28 4 views
0

У меня проблема, которая сводит меня с ума с MVC, C# и Fluent NHibernate (ASP.Net 4.5).Fluent NHibernate: передача параметров пользовательскому методу

У меня есть вызов FNH «GetSession(). Query() ....», который в свою очередь вызывает простой статический метод «VitCommon.ChooseLanguage», передающий параметр «язык» по содержанию. Странно то, что «язык» содержит «ita» непосредственно перед вызовом, в то время как в момент ввода ChooseLanguage он изменен на другое значение.

Глядя на стек вызовов, я вижу, что ничего не было вызвано, кроме пучка методов FNH и ChooseLanguage.

Я уже пробовал эти:

  1. использовал локальную переменную в методе: вар _language = язык;
  2. использует локальную переменную с String.Copy(): var _language = String.Copy (язык);
  3. сделал ChooseLanguage не статическую
  4. переключатель заявление, которое не устанавливает _language с литералов

Ничего они работали. Это часть кода.

public List<Allegato> GetAllegatiBySchedaPk(Vit.TipoScheda tipoScheda, int pkScheda, string tipoMediaSupportati = "", string language = "ita") 
{ 
    tipoMediaSupportati = tipoMediaSupportati + ""; 
    var arTipoMediaSupportati = tipoMediaSupportati.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries); 
    var listTassonoimieImmagini = arTipoMediaSupportati.Select(s => new TassonomiaMultimedia { 
     ID = Convert.ToInt32(s.Split(';')[0]), 
     Descrizione = s.Split(';')[1] 
    }).ToList(); 
    var val = GetSession().Query<TabcMultimedia>() 
    .Join(GetSession().Query<Immagini>(), l => l.fk_immagine, r => r.pk_immagine, (l, r) => new { Multimedia = l, Immagini = r }) 
    .Where(w => w.Multimedia.fk_schedatipo == (int)tipoScheda && w.Multimedia.fk_chiavescheda == pkScheda && w.Immagini.fk_tipo_immagini == 4) 
    .OrderBy(o => o.Multimedia.ordine) 
    .Select(s => new Allegato { 
     IdAllegato = s.Immagini.pk_immagine, 
     Titolo = s.Multimedia.denom_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "denom", language) : VitCommon.ChooseLanguage(s.Immagini, "titolo", language), 
     Didascalia = s.Multimedia.didasca_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "didasca", language) : VitCommon.ChooseLanguage(s.Immagini, "descrizione", language), 
     Tassonomia = GetTassonomiaMultimedia(s.Multimedia.est_inv, listTassonoimieImmagini), 
     Tipo = s.Immagini.immagine_tipo 
    }) 
    .ToList(); 
    return val; 
} 


public static string ChooseLanguage(object oggettoCorrente, string FieldName, string LinguaVitCorrente, bool underscorePresent) { 
    var underscore = "_"; 
    if (!underscorePresent) { 
    underscore = ""; 
    } 
    var retString = ""; 
    var processLang = LinguaVitCorrente; 
    var lingue = LingueVit.GetLingue().Where(l => l.Suffisso.Equals(processLang)).SingleOrDefault(); 
    var i = 0; 
    while (retString == "") { 
    try { 
     retString = 
     (oggettoCorrente.GetType().GetProperty(FieldName + underscore + processLang).GetValue(oggettoCorrente, null) + ""); 
    } 
    catch { 
     retString = "Proprietà non trovata ('" + FieldName + underscore + processLang + 
        "')! il nome della proprietà è case sensitive e per ciascuna tipologia di campo deve essere unfirome, controllare nel mapping dell'oggetto."; 
    } 
    if (retString == "") { 
     try { 
     processLang = lingue.Alternative[i].Suffisso; 
     } 
     catch { 
     retString = "not found"; 
     } 
     i++; 
    } 
    } 
    var returnVal = retString == "not found" ? "" : retString; 
    return returnVal; 
} 

Методом проб и ошибок было установлено, что этот способ работает:

var listaAllegati = GetSession().Query<TabcMultimedia>() 
    .Join(GetSession().Query<Immagini>(), l => l.fk_immagine, r => r.pk_immagine, (l, r) => new { Multimedia = l, Immagini = r }) 
    .Where(w => w.Multimedia.fk_schedatipo == (int)tipoScheda && w.Multimedia.fk_chiavescheda == pkScheda && w.Immagini.fk_tipo_immagini == 4) 
    .OrderBy(o => o.Multimedia.ordine) 
    .ToList(); 

var listaAllegatiLingua = listaAllegati.Select(s => new Allegato { 
    IdAllegato = s.Immagini.pk_immagine, 
    Titolo = s.Multimedia.denom_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "denom", language) : VitCommon.ChooseLanguage(s.Immagini, "titolo", language), 
    Didascalia = s.Multimedia.didasca_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "didasca", language) : VitCommon.ChooseLanguage(s.Immagini, "descrizione", language), 
    Tassonomia = GetTassonomiaMultimedia(s.Multimedia.est_inv, listTassonoimieImmagini), 
    Tipo = s.Immagini.immagine_tipo 
}) 
.ToList(); 

return listaAllegatiLingua; 

Даже поставив вар _language = «ита» работает, конечно, это делает весь метод бесполезен.

Похоже, что некоторые многопоточности в FNH являются виновниками, но мне трудно представить, что и как, может кто-нибудь мне поможет?

Заранее спасибо.

ответ

0

Первый выбор принимает выражение, которое анализируется и частично преобразуется в sql, что может объяснить потерянное значение. Используйте AsEnumerable, чтобы задержать создание результатов в коде, но не имеют промежуточного списка.

return GetSession().Query<TabcMultimedia>() 
    .Join(GetSession().Query<Immagini>(), l => l.fk_immagine, r => r.pk_immagine, (l, r) => new { Multimedia = l, Immagini = r }) 
    .Where(w => w.Multimedia.fk_schedatipo == (int)tipoScheda && w.Multimedia.fk_chiavescheda == pkScheda && w.Immagini.fk_tipo_immagini == 4) 
    .OrderBy(o => o.Multimedia.ordine) 
    .AsEnumerable() 
    .Select(s => new Allegato { 
     IdAllegato = s.Immagini.pk_immagine, 
     Titolo = s.Multimedia.denom_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "denom", language) : VitCommon.ChooseLanguage(s.Immagini, "titolo", language), 
     Didascalia = s.Multimedia.didasca_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "didasca", language) : VitCommon.ChooseLanguage(s.Immagini, "descrizione", language), 
     Tassonomia = GetTassonomiaMultimedia(s.Multimedia.est_inv, listTassonoimieImmagini), 
     Tipo = s.Immagini.immagine_tipo 
    }) 
    .ToList(); 
+0

Спасибо FIRO, это оказалось лучшим решением, поскольку это не только исправили проблему (он «зависает» сгенерированный SQL, не так последующая обработка больше не портит параметр), но и получает лучшую производительность , Обратите внимание, что позиция, в которой помещается предложение .AsEnumerable, чувствительна к результату. Еще раз спасибо. – lfassio

Смежные вопросы